package server;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

import model.Usuario;
import protocol.MensajeComando;

import comandos.InterpreteComando;
import comandos.ComandoServidor;

public class ClienteHilo implements Runnable 
{
	private Socket clientSocket;
	private ObjectInputStream input;
	private ObjectOutputStream output;
	private Usuario usuario;
	private boolean active = true;
	
	public ClienteHilo()
	{
		this.clientSocket = null;
		this.input = null;
		this.output = null;
		this.usuario = null;
	}
	
	
	public ClienteHilo(Socket clientSocket) throws Exception
	{
		//Asigno el socket del cliente
		this.clientSocket = clientSocket;
	}



	public void run ()
	{			
		try{
			this.output = new ObjectOutputStream(this.clientSocket.getOutputStream());
			this.output.flush();
			//Inicializo input y output Streams y obtengo el objeto usuario
			this.input = new ObjectInputStream(this.clientSocket.getInputStream());
		}catch (Exception e){
			System.out.println("Ocurrio un problema al obtener el Stream del cliente");
		}
		
		
		Object comandoRecibido;
		
		//Mientras el cliente este activo
		while (this.active)
		{
			try 
			{
				//Recibo comando del cliente como objeto
				comandoRecibido = input.readObject();
				
				if (comandoRecibido != null)
				{
					//Tomo el mensaje del cliente para desifrar la peticion que realizo
					MensajeComando comandoCliente = (MensajeComando) comandoRecibido;
					
					//Mediante el manejador de comandos del lado del servidor le indico que operacion quiere realizar el cliente
					ComandoServidor comando = InterpreteComando.obtenerComando(comandoCliente.getMensaje());
					
					//Al ejecutarlo se encarga automaticamente de retornar la respuesta al servidor internamente
					comando.ejecutar(this);	
				}

			}
			catch (Exception e)
			{
				this.active = false;
				try 
				{
					this.clientSocket.close();
				} 
				catch (Exception ex) 
				{
					// TODO Auto-generated catch block
					ex.printStackTrace();
				}
			}
		}
		
		try 
		{
			this.clientSocket.close();
		} 
		catch (IOException e) 
		{
			e.printStackTrace();
		}
	}
	
	
	public Socket getClientSocket() {
		return clientSocket;
	}


	public void setClientSocket(Socket clientSocket) {
		this.clientSocket = clientSocket;
	}


	public Usuario getUsuario() {
		return usuario;
	}


	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}


	public boolean isActive() {
		return active;
	}


	public void setActive(boolean active) {
		this.active = active;
	}


	public ObjectInputStream getInput() {
		return input;
	}


	public void setInput(ObjectInputStream input) {
		this.input = input;
	}


	public ObjectOutputStream getOutput() {
		return output;
	}


	public void setOutput(ObjectOutputStream output) {
		this.output = output;
	}
	
	
}
